#include "canopen_timer.h"
#include "tim.h"           // 包含CubeMX生成的TIM配置
#include "canfestival.h"   // CANopen协议栈头文件

// 全局变量
static TIMEVAL last_counter_val = 0;
static TIMEVAL elapsed_time = 0;
static TIM_HandleTypeDef *htim_used = &htim3; // 使用TIM3

// 定时器初始化
void TIM3_Init(void)
{
    /* 计算预分频值 - 90MHz时钟，目标100kHz计数频率 */
    uint32_t PrescalerValue = (90000000 / 100000) - 1; // 90MHz / 100kHz = 900, 900-1=899
    
    /* 重新配置定时器 */
    htim_used->Instance = TIM3;
    htim_used->Init.Prescaler = PrescalerValue;
    htim_used->Init.CounterMode = TIM_COUNTERMODE_UP;
    htim_used->Init.Period = 0xFFFF; // 最大计数值65535
    htim_used->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim_used->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    
    /* 重新初始化定时器 */
    if (HAL_TIM_Base_DeInit(htim_used) != HAL_OK) {
        Error_Handler();
    }
    if (HAL_TIM_Base_Init(htim_used) != HAL_OK) {
        Error_Handler();
    }
    
    
    /* 启用更新中断 */
    HAL_TIM_Base_Start_IT(htim_used);
}

// 设置下一次定时器警报
void setTimer(TIMEVAL value)
{
  
    
    /* 获取当前计数器值并计算经过的时间 */
    uint32_t timer = __HAL_TIM_GET_COUNTER(htim_used);
    elapsed_time += timer - last_counter_val;
    
    /* 设置新的计数器起始值 */
    last_counter_val = 0xFFFF - value;
    __HAL_TIM_SET_COUNTER(htim_used, last_counter_val);
   
}

// 获取自上次调用以来的经过时间
TIMEVAL getElapsedTime(void)
{
    uint32_t timer = __HAL_TIM_GET_COUNTER(htim_used);
    TIMEVAL current_elapsed;
    
    /* 计算当前经过的时间 */
    if (timer < last_counter_val) {
        current_elapsed = (0xFFFF - last_counter_val) + timer;
    } else {
        current_elapsed = timer - last_counter_val;
    }
    
    /* 加上之前累计的时间 */
    return current_elapsed + elapsed_time;
}



// TIM周期完成回调函数
void CanInter(void)
{
        /* 重置计时变量 */
        last_counter_val = 0;
        elapsed_time = 0;
        TIM3->SR &= ~(TIM_SR_UIF);
        /* 调用CANopen时间分发函数 */
        TimeDispatch();
}
